#include <stdio.h>  
#include <errno.h>  
#include <unistd.h>  
#include <signal.h>  
#include <stdlib.h>  

static void sig_hup(int signo){  
  printf("SIGHUP revevied, pid=%d\n",getpid());  
}  

static void pr_ids(char *name){  
  printf("%s:pid=%d,ppid=%d,pgrp=%d,tpgrp=%d\n",  
      name,getpid(),getppid(),getpgrp(),tcgetpgrp(STDIN_FILENO));  
  fflush(stdout);  
}  

int main(void){  
  char c;  
  pid_t pid;  
  pr_ids("parent");  

  if((pid=fork())<0){  
    perror("fork");  
    return -1;  
  }else if(pid > 0){  
    sleep(5);  
    exit(0);  
  }else{  
    pr_ids("child");  
    signal(SIGHUP,sig_hup);  
    kill(getpid(),SIGTSTP);  
    pr_ids("child");  

    if(read(STDIN_FILENO,&c,1) != 1){  
      printf("read error from controlling tty, errno=%d\n",errno);  
    }  
    exit(0);  
  }  

  return 0;  
}  
